<?php
/*
 * 对数据库操作公共函数
 */

use think\Db;
use util\LeftNav;
use think\db\Where;

/**
 * 获取模型列表（后台获取数据转为一维数组）
 * @param string $model 模型
 * @param string $field 查询字段
 * @param string $show_filed 显示内容的字段名
 * @param null $map 查询条件
 * @param null $extra 额外选项
 * @return mixed
 */
function getModelList($model = '', $field = '', $show_filed = '', $map = [], $extra = null)
{
    $data = db($model)->field($field)->where(new Where($map))->select();

    $result = [];
    if ($extra) {
        $result[0] = $extra;
    }

    //转换成一维数组
    foreach ($data as $val) {
        $result[$val['id']] = $val[$show_filed];
    }
    return $result;
}

/**
 * 根据pid（父级ID）生成树状列表
 * @to: 主要用于后台多级菜单列表
 * @param string $model 数据表
 * @param string $field 字段
 * @param array $map 查询条件 统一为批量（字段）查询
 * @param int $is_oneArray 是否生成一维数组
 * @param string $extra 额外选项，如作为一级菜单
 * @return array
 * @throws \think\db\exception\DataNotFoundException
 * @throws \think\db\exception\ModelNotFoundException
 * @throws \think\exception\DbException
 */
function createTreeNav($model = '', $field = '', $map = [], $is_oneArray = 0, $extra = '')
{
    $nav = new LeftNav();
    $category = Db::name($model)->field($field)->where($map)->select();
    $arr = $nav::category($category);
    if ($is_oneArray == 0) {
        return $arr;
    } else {
        return $nav::toOptionArray($arr, 'id', 'leftTitle', $extra);
    }
}

/**
 * 根据id获取数据 Db类获取
 * @param string $model 模型
 * @param string $field 查询字段
 * @param int $id ID
 * @return mixed
 * @throws \think\db\exception\DataNotFoundException
 * @throws \think\db\exception\ModelNotFoundException
 * @throws \think\exception\DbException
 */
function getModelByID($model = '', $field = '', $id = 0)
{
    $data = Db::name($model)->field($field)->where('id', intval($id))->findOrEmpty();
    return $data;
}

/**
 * 根据id获取数据 model获取
 * @param string $model 模型
 * @param string $field 查询字段
 * @param int $id ID
 * @return mixed
 * @throws \think\exception\DbException
 */
function getModelByIdMode($model = '', $field = '', $id = 0)
{
    $data = model($model)->field($field)->get($id);
    return $data;
}

/**
 * 根据条件获取数据
 * @param string $model 模型
 * @param string $field 查询字段
 * @param array $map 查询条件， 为了方便使用new Where()
 * @param array $sort 排序条件
 * @param int $is_array 是否返回数组，否则返回1条数据，是则返回多条数据
 * @return mixed
 * @throws \think\db\exception\DataNotFoundException
 * @throws \think\db\exception\ModelNotFoundException
 * @throws \think\exception\DbException
 */
function getModelByMap($model = '', $field = '', $map = [], $sort = [], $is_array = 1)
{
    $list = Db::name($model)->field($field)->where(new Where($map))->order($sort)->select();

    if ($is_array == 0) {
        return $list[0];
    } else {
        return $list;
    }
}

/**
 * 使用paginate分页，返回items分页数据和total数据总数,主要后台使用
 * @param string $model 数据表
 * @param string $field 查询字段
 * @param int $pageSize 页数
 * @param array $map 查询条件
 * @param array $sort 排序
 * @return array
 * @throws \think\exception\DbException
 */
function getModelByPageToAdmin($model = '', $field = '', $pageSize = 10, $map = [], $sort = [])
{
    $list = Db::name($model)->field($field)->where(new Where($map))->order($sort)->paginate($pageSize);
    if ($list) {
        $data['items'] = $list->items();
        $data['total'] = $list->total();
    } else {
        $data = [];
    }

    return $data;
}

/**
 * 使用page分页，返回data结果数据
 * @param string $model 数据表
 * @param string $field 查询字段
 * @param array $map 查询条件
 * @param int $page 页数
 * @param int $count 个数
 * @param array $sort 排序
 * @return array
 * @throws \think\Exception
 */
function getModelByPage($model = '', $field = '', $map = [], $page = 1, $count = 10, $sort = [])
{
    $list = model($model)::field($field)->where(new Where($map))->page($page, $count)->order($sort)->all();
    if ($list) {
        $data['items'] = $list;
        $data['total'] = model($model)::where($map)->count();
    } else {
        $data = [];
    }
    return $data;
}

/**
 * 使用page分页，主要接口或者前端数据分页使用
 * @param string $model 数据表
 * @param string $field 查询字段
 * @param int $page
 * @param int $pageSize 页数
 * @param array $map 查询条件
 * @param array $sort 排序
 * @return array
 * @throws \think\Exception
 */
function getModelByPageToApi($model = '', $field = '', $page = 1, $pageSize = 10, $map = [], $sort = [])
{
    $list = Db::name($model)->field($field)->where(new Where($map))->order($sort)->page($page, $pageSize)->select();
    return count($list) > 0 ? $list : [];
}

/**
 * 根据条件查询某个字段的值(只支持单个查询条件)
 * @param string $model 数据表
 * @param string $field 查询字段
 * @param null $map 查询条件，格式'id,1'
 * @return mixed
 */
function getModelByValue($model = '', $field = '', $map = null)
{
    $where = explode(',', $map); //将查询条件切分为字段和值
    return Db::name($model)->where($where[0], $where[1])->value($field);
}

/**
 * 根据条件查询某个列的值(只支持单个查询条件)
 * @param string $model 数据表
 * @param string $field 查询字段
 * @param null $map 查询条件，格式'id,1'
 * @param string $use_index 指定字段的值作为索引
 * @return mixed
 */
function getModelByColumn($model = '', $field = '', $map = null, $use_index = '')
{
    $where = explode(',', $map);
    if (!empty($use_index)) {
        $list = Db::name($model)->where($where[0], $where[1])->column($field, $use_index);
    } else {
        $list = Db::name($model)->where($where[0], $where[1])->column($field);
    }
    return $list;
}

/**
 * 添加数据
 * @param string $model 模型
 * @param null $data 数据
 * @return bool
 */
function addModel($model = '', $data = null)
{
    //将不存在的字段自动抛弃
    $res = Db::name($model)->strict(false)->insertGetId($data);
    if ($res > 0) {
        return $res;
    } else {
        return false;
    }
}

/**
 * 修改数据
 * @param string $model 数据表
 * @param array $data 数据
 * @param string $map 修改条件 格式为'id,1'
 * @return bool
 * @throws \think\Exception
 * @throws \think\exception\PDOException
 */
function editModel($model = '', $data = [], $map = null)
{
    if (!empty($map)) {
        $where = explode(',', $map);
        $result = Db::name($model)->where($where[0], $where[1])->strict(false)->update($data);
    } else {
        $result = Db::name($model)->strict(false)->update($data);
    }
    if ($result !== false) {
        return true;
    } else {
        return false;
    }
}

/**
 * 使用模型添加/编辑数据
 * @param string $model 模型
 * @param null $data 数据
 * @param null $map 编辑条件
 * @return bool
 */
function saveDataByModel($model = '', $data = null, $map = null)
{
    //将不存在的字段自动抛弃
    $res = model($model)->allowField(true)->save($data, $map);
    if ($res) {
        return $res;
    } else {
        return false;
    }
}

/**
 * 根据条件删除数据
 * @param string $model 模型
 * @param null $map 刪除條件
 * @return bool
 * @throws \think\Exception
 * @throws \think\exception\PDOException
 */
function deleteModel($model = '', $map = null)
{
    $result = Db::name($model)->where(new Where($map))->delete();
    if ($result > 0) {
        return true;
    } else {
        return false;
    }
}

/**
 * 数据字段增/减 1
 * @param string $model 模型
 * @param null $map 条件
 * @param null $field 操作字段
 * @param int $value 数字
 * @param int $action 操作，1增加，2减少
 * @return bool
 * @throws \think\Exception
 */
function updateModelValue($model = '', $map = null, $field = null, $value = 1, $action = 1)
{
    if ($action == 1) {
        $result = Db::name($model)->where($map)->setInc($field, $value);
    } else {
        $result = Db::name($model)->where($map)->setDec($field, $value);
    }
    if ($result > 0) {
        return true;
    } else {
        return false;
    }
}
